#!/bin/bash

# Yao Framework 示例和测试验证脚本
# 自动化执行所有示例程序和单元测试的功能验证

set -e  # 遇到错误立即退出

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_header() {
    echo -e "${PURPLE}========================================${NC}"
    echo -e "${PURPLE}$1${NC}"
    echo -e "${PURPLE}========================================${NC}"
}

# 检查环境
check_environment() {
    log_header "🔍 检查环境配置"
    
    # 检查仓颉编译器
    if ! command -v cjpm &> /dev/null; then
        log_error "未找到cjpm命令，请确保已安装仓颉编译器"
        exit 1
    fi
    log_success "仓颉编译器检查通过"
    
    # 检查项目目录
    if [ ! -f "cjpm.toml" ]; then
        log_error "未找到cjpm.toml文件，请在项目根目录运行此脚本"
        exit 1
    fi
    log_success "项目目录检查通过"
    
    # 检查DeepSeek API密钥
    if [ -z "$DEEPSEEK_API_KEY" ]; then
        log_warning "未设置DEEPSEEK_API_KEY环境变量，将使用代码中的默认密钥"
    else
        log_success "DeepSeek API密钥已配置"
    fi
    
    echo ""
}

# 编译项目
build_project() {
    log_header "🔨 编译项目"
    
    log_info "开始编译Yao Framework..."
    if cjpm build; then
        log_success "项目编译成功"
    else
        log_error "项目编译失败"
        exit 1
    fi
    
    echo ""
}

# 运行示例验证
run_examples() {
    log_header "🚀 运行示例程序验证"
    
    local examples=(
        "yao.examples.ai_agent_validation:AI Agent深度验证"
        "yao.examples:主要功能展示"
        "yao.examples.dsl:DSL功能演示"
        "yao.examples.providers:Provider系统演示"
    )
    
    local success_count=0
    local total_count=${#examples[@]}
    
    for example in "${examples[@]}"; do
        IFS=':' read -r binary_name description <<< "$example"
        
        log_info "运行 ${description} (${binary_name})"
        
        local binary_path="./target/release/bin/${binary_name}"
        
        if [ ! -f "$binary_path" ]; then
            log_error "未找到可执行文件: $binary_path"
            continue
        fi
        
        # 设置超时时间（5分钟）
        if timeout 300 "$binary_path" > "logs/${binary_name}_output.log" 2>&1; then
            log_success "${description} 执行成功"
            ((success_count++))
        else
            local exit_code=$?
            if [ $exit_code -eq 124 ]; then
                log_warning "${description} 执行超时（5分钟）"
            else
                log_error "${description} 执行失败，退出码: $exit_code"
            fi
            log_info "详细日志: logs/${binary_name}_output.log"
        fi
        
        echo ""
    done
    
    log_info "示例程序验证完成: ${success_count}/${total_count} 成功"
    echo ""
}

# 运行单元测试
run_unit_tests() {
    log_header "🧪 运行单元测试"
    
    log_info "开始运行单元测试..."
    
    # 创建测试日志目录
    mkdir -p logs/tests
    
    # 运行所有测试
    if cjpm test > logs/tests/unit_tests.log 2>&1; then
        log_success "单元测试全部通过"
    else
        log_warning "部分单元测试失败，详细信息请查看日志"
        log_info "测试日志: logs/tests/unit_tests.log"
    fi
    
    echo ""
}

# 验证网络连接
verify_network() {
    log_header "🌐 验证网络连接"
    
    log_info "测试DeepSeek API连接..."
    
    # 使用curl测试API连接
    if curl -s --max-time 10 "https://api.deepseek.com/v1/models" > /dev/null; then
        log_success "DeepSeek API连接正常"
    else
        log_warning "DeepSeek API连接失败，可能影响真实API测试"
    fi
    
    echo ""
}

# 生成验证报告
generate_report() {
    log_header "📊 生成验证报告"
    
    local report_file="verification_report_$(date +%Y%m%d_%H%M%S).md"
    
    cat > "$report_file" << EOF
# Yao Framework 验证报告

**生成时间**: $(date)
**验证环境**: $(uname -s) $(uname -r)
**仓颉版本**: $(cjpm --version 2>/dev/null || echo "未知")

## 验证结果摘要

### 示例程序验证
EOF
    
    # 检查示例程序执行结果
    local examples=(
        "yao.examples.ai_agent_validation"
        "yao.examples"
        "yao.examples.dsl"
        "yao.examples.providers"
    )
    
    for example in "${examples[@]}"; do
        if [ -f "logs/${example}_output.log" ]; then
            local last_line=$(tail -n 1 "logs/${example}_output.log")
            if [[ "$last_line" == *"成功"* ]] || [[ "$last_line" == *"完成"* ]]; then
                echo "- ✅ ${example}: 执行成功" >> "$report_file"
            else
                echo "- ❌ ${example}: 执行失败" >> "$report_file"
            fi
        else
            echo "- ⚠️ ${example}: 未执行" >> "$report_file"
        fi
    done
    
    cat >> "$report_file" << EOF

### 单元测试验证
EOF
    
    if [ -f "logs/tests/unit_tests.log" ]; then
        if grep -q "success" "logs/tests/unit_tests.log"; then
            echo "- ✅ 单元测试: 全部通过" >> "$report_file"
        else
            echo "- ❌ 单元测试: 部分失败" >> "$report_file"
        fi
    else
        echo "- ⚠️ 单元测试: 未执行" >> "$report_file"
    fi
    
    cat >> "$report_file" << EOF

### 网络连接验证
- DeepSeek API: $(curl -s --max-time 5 "https://api.deepseek.com/v1/models" > /dev/null && echo "✅ 连接正常" || echo "❌ 连接失败")

## 详细日志
- 示例程序日志: logs/
- 单元测试日志: logs/tests/
- 验证脚本日志: 控制台输出

## 建议
1. 如有失败项目，请查看对应日志文件
2. 确保网络连接正常，能够访问DeepSeek API
3. 验证DeepSeek API密钥的有效性
4. 检查系统环境和依赖项

---
*报告生成时间: $(date)*
EOF
    
    log_success "验证报告已生成: $report_file"
    echo ""
}

# 清理函数
cleanup() {
    log_info "清理临时文件..."
    # 这里可以添加清理逻辑
}

# 主函数
main() {
    # 设置错误处理
    trap cleanup EXIT
    
    # 创建日志目录
    mkdir -p logs
    
    log_header "🤖 Yao Framework 示例和测试验证"
    echo -e "${CYAN}开始全面验证Yao Framework的功能和性能${NC}"
    echo ""
    
    # 执行验证步骤
    check_environment
    build_project
    verify_network
    run_examples
    run_unit_tests
    generate_report
    
    log_header "🎉 验证完成"
    log_success "Yao Framework验证流程已完成"
    log_info "请查看生成的验证报告了解详细结果"
    
    echo ""
    echo -e "${CYAN}感谢使用Yao Framework！${NC}"
}

# 脚本入口
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    main "$@"
fi
